package br.edu.granbery.indianostore.action;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.edu.granbery.indianostore.controller.Action;
import br.edu.granbery.indianostore.dao.CarrinhoDao;
import br.edu.granbery.indianostore.dao.DaoFactory;
import br.edu.granbery.indianostore.dao.ItemCarrinhoDao;
import br.edu.granbery.indianostore.dao.VendaDao;
import br.edu.granbery.indianostore.model.Carrinho;
import br.edu.granbery.indianostore.model.ItemCarrinho;
import br.edu.granbery.indianostore.model.Produto;
import br.edu.granbery.indianostore.model.Usuario;
import br.edu.granbery.indianostore.model.Venda;

public class ConcluirVendaAction implements Action{
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		
		String numeroCartao = request.getParameter("txtCartao");
		String codigoSegurancaCartao = request.getParameter("txtNumero");
		String bandeiraCartao = request.getParameter("txtCartao");
		String formaPagamento = request.getParameter("txtFormaPagamento");
		
		RequestDispatcher view;
		if (numeroCartao.equals("") || codigoSegurancaCartao.equals("") || bandeiraCartao.equals("")
				|| formaPagamento.equals("")) {
			request.setAttribute("erro",
					"Preencha todos os campos corretamente");
		}else{
			HttpSession sessao = request.getSession(true);
			DaoFactory factory = (DaoFactory) sessao.getAttribute("factory");
			double valor = 0;
			List<Produto>produtos = (List<Produto>)sessao.getAttribute("Carrinho");
			List<ItemCarrinho> itensCarrinho = new ArrayList<ItemCarrinho>();
			Usuario usuario = (Usuario)sessao.getAttribute("User");
			
			//Carrinho
			Carrinho carrinho = new Carrinho();
			carrinho.setCliente(usuario.getCliente());
			
			//ItemCarrinho
			for(Produto produto : produtos){
				valor = valor + produto.getValor();
				ItemCarrinho itemCarrinho = new ItemCarrinho();
				itemCarrinho.setCarrinho(carrinho);
				itemCarrinho.setProduto(produto);
				itemCarrinho.setQtd(1);
				itensCarrinho.add(itemCarrinho);
				//carrinho.setItemCarrinho(itemCarrinho);
			}
			
			//Venda
			Venda venda = new Venda();
			venda.setNumeroCartao(numeroCartao);
			venda.setCodigoSegurancaCartao(codigoSegurancaCartao);
			venda.setBandeiraCartao(bandeiraCartao);
			venda.setFormaPagamento(formaPagamento);
			venda.setValor(valor);
			DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			Date date = new Date();
			venda.setData(dateFormat.format(date));
			venda.setCarrinho(carrinho);
			
			//Persistindo Carrinho
			CarrinhoDao carrinhoDao = factory.getCarrinhoDao();
			factory.beginTransaction();
			if(carrinhoDao.inserir(carrinho)){
				factory.commit();
			}else{
				if (factory.hasTransaction()) {
					factory.stopTransaction();
				}
			}
			carrinhoDao.destruir(carrinho);
			
			//Persistindo itemCarrinho
			for(ItemCarrinho itemCarrinho : itensCarrinho){
				ItemCarrinhoDao itemCarrinhoDao = factory.getItemCarrinhoDao();
				factory.beginTransaction();
				if(itemCarrinhoDao.inserir(itemCarrinho)){
					factory.commit();
				}else{
					if (factory.hasTransaction()) {
						factory.stopTransaction();
					}
				}
				itemCarrinhoDao.destruir(itemCarrinho);
			}

			//Persistindo Venda
			VendaDao vendaDao = factory.getVendaDao();
			factory.beginTransaction();
			if(vendaDao.inserir(venda)){
				request.setAttribute("sucess","Venda finalizada com sucesso.");
				factory.commit();
			}else{
				request.setAttribute("erro", "Erro ao finalizar venda.");
				if (factory.hasTransaction()) {
					factory.stopTransaction();
				}
			}
			vendaDao.destruir(venda);
		}
		try {
			view = request.getRequestDispatcher("FrontController?action=ListarProduto");
			view.forward(request, response);
		} catch (ServletException ex) {
			Logger.getLogger(CadastrarUsuarioAction.class.getName()).log(
					Level.SEVERE, null, ex);
		}
	}	
}
